<?php

namespace Backoffice\Controller;

use Zend\View\Model\ViewModel;
use Zend\Mvc\Controller\AbstractActionController;

class ProduitController extends AbstractActionController
{
    /**
    * Entity manager instance
    *
    * @var Doctrine\ORM\EntityManager
    */
    protected $em;

    /**
    * Returns an instance of the Doctrine entity manager loaded from the service
    * locator
    *
    * @return Doctrine\ORM\EntityManager
    */
    
    public function getEntityManager()
    {
        if (null === $this->em) {
            $this->em = $this->getServiceLocator()
                ->get('doctrine.entitymanager.orm_default');
        }
        return $this->em;
    }
    
    /**
     * Delete all entities given in arguments
     */
    public function removeEntities()
    {
        $em = $this->getEntityManager();
        $args = func_get_args();
        foreach ($args as $arg) {
            foreach ($arg as $entity) {
                $em->remove($entity);
            }
        }
        $em->flush();
    }
    
    public function indexAction()
    {
        $authorize = $this->getServiceLocator()->get('BjyAuthorize\Provider\Identity\ProviderInterface');
        $roles = $authorize->getIdentityRoles();
        $id = $this->zfcUserAuthentication()->getIdentity()->getId();
        
        // Admin logged in.
        if (in_array('admin', $roles)) {
            return array(
                'produits' => $this->getEntityManager()->getRepository('Backoffice\Model\Entity\Produit')->findAll()
            );
        }
        
        // User logged in.
        $boutique = $this->getEntityManager()->find('Backoffice\Model\Entity\Utilisateur', $id)->getBoutique();
        $produits = $this->getEntityManager()->getRepository('Backoffice\Model\Entity\Produit')->findBy(array('boutique' => $boutique));
        
        $moduleConfig = $this->getServiceLocator()->get('config');
        $file_path = $moduleConfig['application']['file_path'];
        $full_file_path = $moduleConfig['application']['full_file_path'];

        $view = new ViewModel(array(
            'produits' => $produits,
            'file_path' => $file_path,
            'full_file_path' => $full_file_path,
        ));
        $view->setTemplate('backoffice/produit/index-user');
        return $view;
    }
    
    public function addAction()
    {
        $authorize = $this->getServiceLocator()->get('BjyAuthorize\Provider\Identity\ProviderInterface');
        $roles = $authorize->getIdentityRoles();
        $id = $this->zfcUserAuthentication()->getIdentity()->getId();
        
        // Admin logged in.
        if (in_array('admin', $roles)) {
            die("action not implemented yet for admin :)");
        }
        
        // User logged in.        
        $produit = new \Backoffice\Model\Entity\Produit();
        
        $fsm = $this->getServiceLocator()->get('FormElementManager');
        $form = $fsm->get('Backoffice\Form\ProduitForm');
        $form->bind($produit);
        
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            
            if ($form->isValid()) {
                $boutique = $this->getEntityManager()->find('Backoffice\Model\Entity\Utilisateur', $id)->getBoutique();
                $produit->setBoutique($boutique);
                $this->getEntityManager()->persist($produit);
                $this->getEntityManager()->flush();
                $this->flashMessenger()->addSuccessMessage('Produit créé !');
                $this->redirect()->toRoute('produitback');
            }
        }
        
        $view = new ViewModel(array('form' => $form));
        $view->setTemplate('backoffice/produit/add-user');
        return $view;
    }
    
    public function editAction()
    {
        $authorize = $this->getServiceLocator()->get('BjyAuthorize\Provider\Identity\ProviderInterface');
        $roles = $authorize->getIdentityRoles();
        $id = $this->zfcUserAuthentication()->getIdentity()->getId();
        
        // Admin logged in.
        if (in_array('admin', $roles)) {
            die("action not implemented yet for admin :)");
        }
        
        // User logged in.        
        $productId = $this->params('id');
        if (is_null($productId)) {
            return $this->redirect()->toRoute('produitback');
        }

        $produit = $this->getEntityManager()->find('Backoffice\Model\Entity\Produit', $productId);
        if (is_null($produit)) {
            return $this->redirect()->toRoute('produitback');
        }
        
        $boutiqueProduit= $produit->getBoutique()->getId();
        $boutiqueUtilisateur = $this->getEntityManager()->find('Backoffice\Model\Entity\Utilisateur', $id)->getBoutique()->getId();
        if ($boutiqueProduit !== $boutiqueUtilisateur) { // acces interdit !
            return $this->redirect()->toRoute('produitback');
        }
        
        $fsm = $this->getServiceLocator()->get('FormElementManager');
        $form = $fsm->get('Backoffice\Form\ProduitForm');
        $form->bind($produit);
        
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            
            if ($form->isValid()) {
                $this->getEntityManager()->persist($produit);
                $this->getEntityManager()->flush();
                $this->flashMessenger()->addSuccessMessage('Produit modifié !');
                $this->redirect()->toRoute('produitback');
            }
        }
        
        $view = new ViewModel(array('form' => $form));
        $view->setTemplate('backoffice/produit/edit-user');
        return $view;
    }

    public function deleteAction()
    {
        $authorize = $this->getServiceLocator()->get('BjyAuthorize\Provider\Identity\ProviderInterface');
        $roles = $authorize->getIdentityRoles();
        $id = $this->zfcUserAuthentication()->getIdentity()->getId();
        
        // Admin logged in.
        if (in_array('admin', $roles)) {
            $error = null;
            $id = (int) $this->params()->fromRoute('id', 0);
            if (!$id) {
                return $this->redirect()->toRoute('produitback');
            }

            $em = $this->getEntityManager();
            $produit = $em->find('Backoffice\Model\Entity\Produit', $id);
            $request = $this->getRequest();

            if ($request->isPost()) {
                $del = $request->getPost('del', 'No');
                if ($del == 'Yes') {
                    if ($produit) {

                        // Supprimer les enchères existantes sur ce produit
                        $encheres = $em->getRepository('Backoffice\Model\Entity\Enchere')
                            ->findBy(array('produit' => $produit));
                        $this->removeEntities($encheres);

                        // Supprimer le produit
                        $em->remove($produit);
                        $em->flush();

                    }
                }

                // Redirect to list of produits
                return $this->redirect()->toRoute('produitback');

            }

            if (is_null($produit)) {
                $error = "Le produit numero $id n'existe pas !";
            }

            return array(
                'id'    => $id,
                'produit' => $produit,
                'error' => $error,
            );  
        }
        
        // User logged in.
        $productId = $this->params('id');
        if (is_null($productId)) {
            return $this->redirect()->toRoute('produitback');
        }

        $produit = $this->getEntityManager()->find('Backoffice\Model\Entity\Produit', $productId);
        if (is_null($produit)) {
            return $this->redirect()->toRoute('produitback');
        }
        
        $boutiqueProduit= $produit->getBoutique()->getId();
        $boutiqueUtilisateur = $this->getEntityManager()->find('Backoffice\Model\Entity\Utilisateur', $id)->getBoutique()->getId();
        if ($boutiqueProduit !== $boutiqueUtilisateur) { // acces interdit !
            return $this->redirect()->toRoute('produitback');
        }
        
        $fsm = $this->getServiceLocator()->get('FormElementManager');
        $form = $fsm->get('Backoffice\Form\ProduitDeleteForm');
        $form->bind($produit);
        
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            
            if ($form->isValid()) {
                $this->getEntityManager()->remove($produit);
                $this->getEntityManager()->flush();
                $this->flashMessenger()->addSuccessMessage('Produit supprimé !');
                $this->redirect()->toRoute('produitback');
            }
        }
        
        $view = new ViewModel(array(
            'form' => $form,
            'produit' => $produit,
        ));
        $view->setTemplate('backoffice/produit/delete-user');
        return $view;
    }

}
